/**
 * N张牌，每张牌有两个数字A和C。
 * 重复操作：
 *     选择两张牌，使得Ax > Ay 且 Cx < Cy，把y扔掉
 * 问最后剩下的牌
 * 题目已经指明结果必然唯一
 * 按(a,c)排序，记作数组A，并且将所有的c值构成一个集合记作ss
 * for A 中的每张牌 i:
 *     把所有a值与i一样的牌的c值从ss中删除
 *     如果此时ss中最小的数比i.c要小，说明有牌可以将i扔掉；反之就是没有牌能够让i出局，记录i
 * 所有记录下的i排序输出即可
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>

using llt = long long;
using vi = vector<int>;
using pii = pair<int, int>;
using vpii = vector<pii>;
using vll = vector<llt>;

template<typename T>
void input(vector<T> & a, int n){
    a.assign(n + 1, {});
    for(int i=1;i<=n;++i) cin >> a[i];
    return;
}

template<typename T>
istream & operator >> (istream & is, vector<T> & v){
    for(auto & i : v) is >> i;
    return is;
}

struct T{
    int a;
    int c;
    int pos;
    bool operator < (const T & right) const{
        if(a != right.a) return a < right.a;
        if(c != right.c) return c < right.c;
        return pos < right.pos;
    }
};

int N;
vector<T> A;

void work(){
    cin >> N;
    A.assign(N, {});
    int k = 0;
    multiset<int> ss;
    for(auto & t : A){
        t.pos = ++k;
        cin >> t.a >> t.c;
        ss.insert(t.c);
    }
    sort(A.begin(), A.end());

    vector<int> ans;
    k = 0;
    for(const auto & t : A){
        while(k < N and t.a == A[k].a){
            ss.erase(A[k].c);
            k += 1;
        }
        if(not ss.empty() and *ss.begin() < t.c){

        }else{
            ans.push_back(t.pos);
        }
    }    
    sort(ans.begin(), ans.end());
    cout << ans.size() << endl;
    for(auto i : ans) cout << i << " "; cout << endl;
    return; 
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;

    while(nofkase--) work();
    return 0;
}